/* ------------------------------------------------------------------ */
/*  角色管理 API 接口封装 - 基于实际后端接口                               */
/* ------------------------------------------------------------------ */
import request from '@/utils/request'
import type { ApiResp } from '@/utils/request'
import { ElMessage } from 'element-plus'

/* ------------------------------------------------------------------ */
/*  类型定义 - 基于后端实际字段结构                                        */
/* ------------------------------------------------------------------ */

/** 后端角色数据结构 */
export interface Role {
  id?: number
  name: string
  code: string
  description?: string
  status?: boolean  // 后端返回的是boolean类型
  createTime?: string
  updateTime?: string
  sort?: number
  remark?: string
}

/** 前端表单数据结构 */
export interface RoleForm {
  id?: number
  name: string
  code: string
  description?: string
  status: boolean  // 改为boolean类型
  sort?: number
  remark?: string
}

/** 角色菜单权限 */
export interface RoleMenuIds {
  roleId: number
  menuIds: number[]
}

/* ------------------------------------------------------------------ */
/*  接口封装 - 基于实际API路径                                           */
/* ------------------------------------------------------------------ */

/** 获取角色信息 - GET /api/role/{id} */
export const getRoleById = (id: number) => {
  return request.get<ApiResp<Role>>(`/api/role/${id}`)
    .catch(error => {
      console.error('获取角色信息失败:', error)
      ElMessage.error('获取角色信息失败，请检查网络连接或联系管理员')
      throw error
    })
}

/** 角色列表查询参数 */
export interface RoleListParams {
  PageNum?: number
  PageSize?: number
  Keywords?: string
  DictId?: number
}

/** 角色列表响应数据 */
export interface RoleListResponse {
  total: number
  list: Role[]
}

/** 获取角色列表 - GET /api/role/list */
export const getRoleList = (params?: RoleListParams) => {
  return request.get<ApiResp<RoleListResponse>>('/api/role/list', { params })
    .then(response => {
      console.log('角色列表数据:', response)
      return response
    })
    .catch(error => {
      console.error('获取角色列表失败:', error)
      ElMessage.error('获取角色列表失败，请检查网络连接或联系管理员')
      throw error
    })
}

/** 新增角色 - POST /api/role/add */
export const addRole = (data: RoleForm) => {
  const submitData = {
    name: data.name,
    code: data.code,
    description: data.description || '',
    status: data.status,
    sort: data.sort || 0,
    remark: data.remark || ''
  }

  return request.post<ApiResp>('/api/role/add', submitData)
    .then(response => {
      ElMessage.success('新增角色成功')
      return response
    })
    .catch(error => {
      console.error('新增角色失败:', error)
      ElMessage.error('新增角色失败，请检查网络连接或联系管理员')
      throw error
    })
}

/** 更新角色 - POST /api/role/edit */
export const updateRole = (data: RoleForm) => {
  const submitData = {
    id: data.id,
    name: data.name,
    code: data.code,
    description: data.description || '',
    status: data.status,
    sort: data.sort || 0,
    remark: data.remark || ''
  }

  return request.post<ApiResp>('/api/role/edit', submitData)
    .then(response => {
      ElMessage.success('更新角色成功')
      return response
    })
    .catch(error => {
      console.error('更新角色失败:', error)
      ElMessage.error('更新角色失败，请检查网络连接或联系管理员')
      throw error
    })
}

/** 删除角色 - POST /api/role/delete/{ids} */
export const deleteRole = (ids: number | number[]) => {
  const idParam = Array.isArray(ids) ? ids.join(',') : ids.toString()

  return request.post<ApiResp>(`/api/role/delete/${idParam}`)
    .then(response => {
      ElMessage.success('删除角色成功')
      return response
    })
    .catch(error => {
      console.error('删除角色失败:', error)
      ElMessage.error('删除角色失败，请检查网络连接或联系管理员')
      throw error
    })
}

/** 获取角色项列表 - GET /api/role/items */
export const getRoleItems = () => {
  return request.get<ApiResp<Role[]>>('/api/role/items')
    .catch(error => {
      console.error('获取角色项列表失败:', error)
      ElMessage.error('获取角色项列表失败，请检查网络连接或联系管理员')
      throw error
    })
}

/** 获取角色菜单集合 - GET /api/role/role-menu-ids/{id} */
export const getRoleMenuIds = (id: number) => {
  return request.get<ApiResp<number[]>>(`/api/role/role-menu-ids/${id}`)
    .catch(error => {
      console.error('获取角色菜单集合失败:', error)
      ElMessage.error('获取角色菜单集合失败，请检查网络连接或联系管理员')
      throw error
    })
}

/** 保存角色授权的菜单 - POST /api/role/set-role-menu/{id} */
export const setRoleMenu = (id: number, menuIds: number[]) => {
  return request.post<ApiResp>(`/api/role/set-role-menu/${id}`, { menuIds })
    .then(response => {
      ElMessage.success('保存角色菜单权限成功')
      return response
    })
    .catch(error => {
      console.error('保存角色菜单权限失败:', error)
      ElMessage.error('保存角色菜单权限失败，请检查网络连接或联系管理员')
      throw error
    })
}

/* ------------------------------------------------------------------ */
/*  工具函数                                                           */
/* ------------------------------------------------------------------ */

/** 获取角色状态显示文本 */
export const getRoleStatusText = (status: boolean): string => {
  return status ? '启用' : '禁用'
}

/** 获取角色状态标签类型 */
export const getRoleStatusTagType = (status: boolean): string => {
  return status ? 'success' : 'danger'
}

/** 数据转换：后端数据转前端表单格式 */
export const transformToFormData = (role: Role): RoleForm => {
  return {
    id: role.id,
    name: role.name,
    code: role.code,
    description: role.description || '',
    status: role.status ?? true,  // 默认为true（启用）
    sort: role.sort || 0,
    remark: role.remark || ''
  }
}

/** 验证角色编码格式 */
export const validateRoleCode = (code: string): boolean => {
  return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(code)
}

/** 生成默认角色编码 */
export const generateDefaultRoleCode = (name: string): string => {
  return name
    .replace(/[^a-zA-Z0-9\u4e00-\u9fa5]/g, '')
    .replace(/[\u4e00-\u9fa5]/g, (char) => {
      // 简单的中文转拼音映射（实际项目中建议使用专业的拼音库）
      const pinyinMap: Record<string, string> = {
        '超级': 'super',
        '管理员': 'admin',
        '操作员': 'operator',
        '用户': 'user',
        '角色': 'role',
        '系统': 'system'
      }
      return pinyinMap[char] || char
    })
    .toLowerCase()
    .replace(/[^a-z0-9]/g, '_')
    .replace(/_+/g, '_')
    .replace(/^_|_$/g, '')
}
